#include "GetProfileOp.h"

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void GetProfileOp::Init()
{
	mLengthFieldSize = 2;
	mProfileData = new ProfileData;

	SetUseAuth2(false);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
GetProfileOp::GetProfileOp(ServerContext *theProfileContext) : ServerRequestOp(theProfileContext)
{
	Init();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
GetProfileOp::GetProfileOp(const IPAddr &theAddr) : ServerRequestOp(theAddr)
{
	Init();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void GetProfileOp::AddAllFields()
{ 
	for(int fieldnum=0; fieldnum < ProfileField_NumFields; fieldnum++)
		AddField( (ProfileField)fieldnum );
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void GetProfileOp::Reset()
{
	mProfileData->Clear();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
WONStatus GetProfileOp::GetNextRequest()
{
	WriteBuffer aBuf(mLengthFieldSize);
	aBuf.AppendByte(5);			// small message
	aBuf.AppendShort(7);		// Profile Service
	aBuf.AppendShort(8);		// Get Profile


	aBuf.AppendShort(mFieldSet.size());
	ProfileFieldSet::iterator anItr = mFieldSet.begin();
	while(anItr!=mFieldSet.end())
	{
		aBuf.AppendLong(*anItr);
		++anItr;
	}

	mRequest = aBuf.ToByteBuffer();
	return WS_ServerReq_Recv;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
WONStatus GetProfileOp::CheckResponse()
{
	ReadBuffer aMsg(mResponse->data(),mResponse->length());
	unsigned char aHeaderType = aMsg.ReadByte();
	unsigned short aServiceType = aMsg.ReadShort();
	unsigned short aMessageType = aMsg.ReadShort();
	if(aHeaderType!=5 || aServiceType!=7 || aMessageType!=9)
		return InvalidReplyHeader();

	mAPIErrorCode = aMsg.ReadLong();
	short aStatus = aMsg.ReadShort();
	aMsg.ReadString(mErrorString);

	mProfileData->UnpackGetReply(aMsg);
	return (WONStatus)aStatus;
}
